﻿using System.Collections.ObjectModel;
using ModelingProjectLib.Interfaces;

namespace INSAwarsWPF
{
    /** ViewModel qui encapsule un joueur */
    public class JoueurViewModel : ViewModelBase
    {
        /** Dernière case sélectionnée par le joueur lors de son tour */
        public CaseViewModel DerniereCaseSelectionnee { get; set; }
        public UniteViewModel DerniereUniteSelectionnee { get; set; }

        /** Model correspondant au ViewModel */
        public Joueur JoueurModel {get; set; }

        /** Listes des villes contrôlées par le joueur */
        public ObservableCollection<VilleViewModel> Villes { get; set; }

        /** Listes des unités contrôlées par le joueur */
        public ObservableCollection<UniteViewModel> Unites { get; set; }

        /** Tableau des couleurs utilisées pour les joueurs */
        public string Couleur { get { return CaseViewModel.tabCouleur[JoueurModel.Num - 1]; } }
        /** Tableau des couleurs réelles utilisées pour les joueurs */
        public string CouleurCode { get { return CaseViewModel.tabCouleurCode[JoueurModel.Num - 1]; } }

        /** Ensemble des joueurs de la partie */
        public EnsembleJoueursViewModel Conteneur { get; set; }

        /** Crée un nouveau JoueurViewModel pour le joueur _j */
        public JoueurViewModel(Joueur _j)
        {
            Villes = new ObservableCollection<VilleViewModel>();
            Unites = new ObservableCollection<UniteViewModel>();
            JoueurModel = _j;
        }
        
        /** Initialise le joueur pour un nouveau tour */
        public void beginNouveauTour()
        {
            // remise à jour des mouvements
 	        //foreach (Unite u in JoueurModel.Civilisation.ListUnites)
            //    u.Mvt = 2;// u.MvtMax;
            foreach (UniteViewModel uvm in Unites) {
                uvm.beginNouveauTour();
            }
            // accumulation des ressources et RAZ du booléen
            foreach (VilleViewModel vvm in Villes) {
                vvm.recolterRessources();
                vvm.ADejaCree = false;
            }

            // message box de résumé : à faire


            RaisePropertyChanged("HasUniteBougeable");
            RaisePropertyChanged("HasDirecteur");
        }

        /** Vrai ssi le joueur a déjà un directeur (unité unique) */
        public bool HasDirecteur
        {
            get
            {
                foreach (UniteViewModel uvm in Unites)
                    if (uvm.UniteModel is Directeur)
                        return true;

                return false;
            }
        }

        /** Vrai ssi il reste des unités avec des points de mouvement non utilisés */
        public bool HasUniteBougeable
        {
            get
            {
                foreach (UniteViewModel uvm in Unites)
                {
                    if (uvm.UniteModel.Mvt > 0) return true;
                }

                return false;
            }
        }

        /** Met à jour le joueur après le déplacement d'une unité */
        public void majJoueurApresDeplacementUnite()
        {
            RaisePropertyChanged("HasUniteBougeable");
        }
    }
}
